package leetcode.math_items;

/**
 *  题意：
 *      求 1+2+...+n ，要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。
 *      1 <= n <= 10000
 *  思路1：
 *      由题我们可以知道能够使用加减、位运算和赋值等操作
 *      首先是递归的思路，即 fun(x): return x == 1 ? 1 : n + fun(n-1)
 *      由于不能使用三目运算符，我们可以使用含短路运算&&、||来替代，只有当 n > 0 的时候才可以执行加法操作
 *      即 n > 0 && (n += sumNums(n-1)) > 0 最后直接返回 n
 *  思路2：
 *      俄罗斯农民乘法：
 *          将A、B两数写在同一行，然后对第一个数乘2，第二个数除2（余数舍去），然后将结果写在下一行中
 *          若B那列数结果为偶数，则舍弃那一行（但是下一次计算仍需要用到），直到B那列的数为1后停止循环
 *          然后将A所对应的那列数字全部相加（被删除的数不加），其结果即为最终的结果
 *      期间不用到除循环以外的其他运算，对于循环，因为 n <= 10000 可以知道其最大14位，因此可以手动添加14次操作解决
 *      同样需要含短路功能的运算符
 */
class Find_1_and_2_and___and_n2 {
    public int sumNums(int n) {
        int ans = 0;
        int a = n;
        int b = n + 1;

        boolean t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        t = (b & 1) == 1 && (ans += a) > 0;
        a <<= 1;
        b >>= 1;

        return ans >> 1;
    }
}
class Find_1_and_2_and___and_n1 {
    public int sumNums(int n) {
        boolean t = n > 0 && (n += sumNums(n-1)) > 0;
        return n;
    }
}
public class Find_1_and_2_and___and_n {
}
